#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_adc.h"
#include "hi_errno.h"

#define LED_TASK_STACK_SIZE 512
#define LED_TASK_PRIO 25
#define LED1_TEST_GPIO 10 //10 for hispark_pegasus
#define LED2_TEST_GPIO 14 // 修改为GPIO14，因为GPIO15可能未定义
#define TASK_DELAY_TIME 200000
#define F1 11 //5 for hispark_pegasus
#define F2 12

int LED_INTERVAL_TIME_US = 300000;

// 为每个LED定义独立的状态变量
static int g_led1State = 0; // 0为关，1为开
static int g_led2State = 0;

// 修改中断处理函数参数类型为void*
static void F1_Pressed(void *arg)
{
    (void)arg;
    printf("F1 Pressed - LED1 Toggle\n");
    
    // 切换LED1状态
    g_led1State = !g_led1State;
    IoTGpioSetOutputVal(LED1_TEST_GPIO, g_led1State);
    
    usleep(TASK_DELAY_TIME); // 消抖延时
}

// 修改中断处理函数参数类型为void*
static void F2_Pressed(void *arg)
{
    (void)arg;
    printf("F2 Pressed - LED2 Toggle\n");
    
    // 切换LED2状态
    g_led2State = !g_led2State;
    IoTGpioSetOutputVal(LED2_TEST_GPIO, g_led2State);
    
    usleep(TASK_DELAY_TIME); // 消抖延时
}

static void ButtonledInit(void)
{
    // 初始化LED1
    IoTGpioInit(LED1_TEST_GPIO);
    hi_io_set_func(LED1_TEST_GPIO, HI_IO_FUNC_GPIO_10_GPIO);
    IoTGpioSetDir(LED1_TEST_GPIO, IOT_GPIO_DIR_OUT);
    
    // 初始化LED2，使用GPIO14代替GPIO15
    IoTGpioInit(LED2_TEST_GPIO);
    hi_io_set_func(LED2_TEST_GPIO, HI_IO_FUNC_GPIO_14_GPIO); // 使用已定义的GPIO14功能
    IoTGpioSetDir(LED2_TEST_GPIO, IOT_GPIO_DIR_OUT);

    // 初始化按键F1
    hi_gpio_init();
    hi_io_set_pull(F1, HI_IO_PULL_UP); 
    hi_io_set_func(F1, HI_IO_FUNC_GPIO_11_GPIO); 
    hi_gpio_set_dir(F1, HI_GPIO_DIR_IN);  
    hi_gpio_register_isr_function(F1,  
                              HI_INT_TYPE_EDGE,  
                              HI_GPIO_EDGE_FALL_LEVEL_LOW,  
                              &F1_Pressed,  
                              NULL);  

    // 初始化按键F2
    hi_io_set_pull(F2, HI_IO_PULL_UP);
    hi_io_set_func(F2, HI_IO_FUNC_GPIO_12_GPIO);
    hi_gpio_set_dir(F2, HI_GPIO_DIR_IN);
    hi_gpio_register_isr_function(F2,
                              HI_INT_TYPE_EDGE,
                              HI_GPIO_EDGE_FALL_LEVEL_LOW,
                              &F2_Pressed,
                              NULL);
    
    // 初始状态：两个LED都关闭
    IoTGpioSetOutputVal(LED1_TEST_GPIO, 0);
    IoTGpioSetOutputVal(LED2_TEST_GPIO, 0);
}

static void *LedTask(const char *arg)
{
    (void)arg;
    
    // 由于现在LED状态由中断直接控制，LED任务可以简化为仅处理闪烁模式
    // 如果不需要闪烁模式，可以完全移除这个任务
    while (1) {
        // 这里可以添加闪烁模式的代码（如果需要）
        usleep(100000); // 降低CPU使用率
    }
    
    return NULL;
}

static void LedExampleEntry(void)
{
    osThreadAttr_t attr;

    ButtonledInit();

    attr.name = "LedTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = LED_TASK_STACK_SIZE;
    attr.priority = LED_TASK_PRIO;

    if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
        printf("[LedExample] Failed to create Ledtask!\n");
    }
}

SYS_RUN(LedExampleEntry);